package com.stefanini.pe.bbva.bp.in.controller;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;

import java.util.List;

import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.bean.RequestScoped;

import javax.faces.context.FacesContext;
import javax.faces.event.ComponentSystemEvent;

import javax.faces.model.SelectItem;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;

import org.primefaces.context.RequestContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import com.pe.bbva.utils.Constantes;
import com.stefanini.pe.bbva.bp.in.bo.iface.ClienteBOIface;
import com.stefanini.pe.bbva.bp.in.bo.iface.ParametrosBOIface;
import com.stefanini.pe.bbva.bp.in.model.AsignacionClienteModel;

import com.stefanini.pe.bbva.bp.in.security.AuthorizationService;
import com.stefanini.pe.bbva.bp.in.to.Cliente;
import com.stefanini.pe.bbva.bp.in.to.NoCliente;
import com.stefanini.pe.bbva.bp.in.to.UsuarioAsesor;
import com.stefanini.pe.bbva.bp.in.to.UsuarioSesion;

import com.stefanini.pe.bbva.bp.in.utils.SpringApplicationContext;
import com.stefanini.pe.bbva.bp.in.utils.Util;

@Controller(value = "asignacionCliente")
@RequestScoped
public class AsignacionClientesController {
	@Autowired
	private ClienteBOIface clienteBO;
	@Autowired
	private ParametrosBOIface parametrosBO;

	private AsignacionClienteModel asignacionClienteModel;	
	public Cliente cliente;	 
	private int rbFormato;
	private SelectItem[] listaFormatos;
	private boolean inMostrarFormMsg;
	private String msgMostrarFormMsg;
	private String hiddenText;
	
	private String mensajeConfirmacion;
	
	private String mensajeAgregar;
	private Map parametrosReporte;
	private List<Cliente> listaTemporalClientes;
	private String fechaActual;
	
	private List<Cliente> listaConsultaClientesFilter;
	private List<Cliente> listaClientesEjecutivoFilter;
	
	public void onPageLoad(ComponentSystemEvent event) {
		try {
			AuthorizationService auth = (AuthorizationService)SpringApplicationContext.getBean("authorizationService");
			if (auth.isSessionUserAndContextValide() &&  !FacesContext.getCurrentInstance().isPostback()) {
				System.out.println("AsignacionClienteController... is not Postback");
				listaConsultaClientesFilter = null;
				listaClientesEjecutivoFilter = null;
				rbFormato=1;
				cliente = new Cliente();
				listaTemporalClientes = null;
				asignacionClienteModel = new AsignacionClienteModel();
				this.setMensajeAgregar("");
				cargarCriteriosBusqueda();
				setListaTemporalClientes(new ArrayList<Cliente>());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void cargarCriteriosBusqueda() {
		try {
			getAsignacionClienteModel().setListaConsultaClientes(new ArrayList<Cliente>());
			cliente= new Cliente();
			
			getAsignacionClienteModel().setListaConsultaClientes (new ArrayList());
			getAsignacionClienteModel().setListaClientesEjecutivo(new ArrayList());
			getAsignacionClienteModel().setListaClientesSeleccionados(new ArrayList());
			getAsignacionClienteModel().setEjecutivoAAsignar(new HashMap());
			getAsignacionClienteModel().setMostrarBtnAgregar(false);
			getAsignacionClienteModel().setListaConsultaClientes(clienteBO.listarClienteNoAsignados(cliente));
			getAsignacionClienteModel().getListaTemporalSeleccionados().clear();
		}catch(Exception e) {
			e.printStackTrace();
		}
	}

	public void agregarClientes(){
		RequestContext context = RequestContext.getCurrentInstance();
		if(listaTemporalClientes.size()>0){
			getAsignacionClienteModel().getListaConsultaClientes().removeAll(listaTemporalClientes);
			getAsignacionClienteModel().getListaClientesSeleccionados().addAll(listaTemporalClientes);
			
			SimpleDateFormat sdf= new SimpleDateFormat("dd/MM/yyyy");
			fechaActual = sdf.format(new Date());
			
			for(Cliente o : listaTemporalClientes){
				if(listaConsultaClientesFilter != null && listaConsultaClientesFilter.size() > 0){
					for(int i=0; i<listaConsultaClientesFilter.size(); i++){
						Cliente ob = listaConsultaClientesFilter.get(i);
						if(ob.getCodcliente().equals(o.getCodcliente())){
							listaConsultaClientesFilter.remove(i);
							break;
						}
					}
				}
			}
		}
		else {
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN,"Debe seleccionar un cliente", ""));
		}
	}
	
	public Map getParametrosReporte(){
		parametrosReporte=new HashMap();
		FacesContext ctx = FacesContext.getCurrentInstance();
		
		UsuarioSesion usuarioSesion =(UsuarioSesion)((HttpSession) ctx.getExternalContext().getSession(false)).
			        	getAttribute(Constantes.USUARIO_SESSION);
		Calendar c=Calendar.getInstance();
		
		parametrosReporte.put("p_fecha",new SimpleDateFormat("dd/MM/yyyy").format(new Date()));
		
		parametrosReporte.put("p_fechaRebalanceo",new SimpleDateFormat("dd/MM/yyyy").format(new Date()));
		
		if(usuarioSesion!=null){
			parametrosReporte.put("p_fechaInformacion",Util.formatDate(usuarioSesion.getFechaInformacion()));
			parametrosReporte.put("p_nombEjecutivo",usuarioSesion.retornaNombreCompleto());
			parametrosReporte.put("p_mailEjecutivo",usuarioSesion.getEmail());
			parametrosReporte.put("p_telfEjecutivo",usuarioSesion.getTelefono());
		}
		
		if(((HttpSession)ctx.getExternalContext().getSession(true)).getAttribute(Constantes.OBJETO_CLIENTE_SESSION)!=null) {
			Cliente oCliente= (Cliente)((HttpSession)ctx.getExternalContext().getSession(true)).getAttribute(Constantes.OBJETO_CLIENTE_SESSION);
			parametrosReporte.put("p_nombCliente",oCliente.getNomtarjeta()==null?oCliente.retornaNombreCompleto():oCliente.getNomtarjeta());
			parametrosReporte.put("p_nombPerfil",oCliente.getNombreperfil());
			parametrosReporte.put("p_tipodoc",oCliente.getTipdoc());
			parametrosReporte.put("p_nrodoc",oCliente.getNrodoc());
		}
		
		if(((HttpSession)ctx.getExternalContext().getSession(true)).getAttribute(Constantes.OBJETO_NO_CLIENTE_SESSION)!=null) {
		   
			NoCliente noCliente= (NoCliente)((HttpSession)ctx.getExternalContext().getSession(true)).getAttribute(Constantes.OBJETO_NO_CLIENTE_SESSION);
			parametrosReporte.put("p_nombNoCliente",noCliente.getNomtarjeta()==null?noCliente.retornaNombreCompleto():noCliente.getNomtarjeta());
			parametrosReporte.put("p_nombPerfilNoCliente",noCliente.getNombreperfil());
			parametrosReporte.put("p_tipoDocNoCliente",noCliente.getDestipdoc());
			parametrosReporte.put("p_nroDocNoCliente",noCliente.getNrodoc());
		
		}
		 
		parametrosReporte.put("REPORT_LOCALE",new java.util.Locale("en") );
		parametrosReporte.put("image_path", (String)((ServletContext)ctx.getExternalContext().getContext()).getRealPath(Constantes.IMAGE_BBVA_REPORT));
		
		return parametrosReporte;
	}
	
	public void changeEjecutivo(){
		try {
			HashMap ejecutivoSelected = asignacionClienteModel.getEjecutivoAAsignar();

			if(ejecutivoSelected.get("value")!=null && !ejecutivoSelected.get("value").toString().equals("")){	

			   String idNuevo =ejecutivoSelected.get("value")+"";

				FacesContext ctx=FacesContext.getCurrentInstance();
				this.setMensajeAgregar("");
				
				UsuarioAsesor usuarioAsesor = new UsuarioAsesor();
			    usuarioAsesor.setIdUsuarioAsesor(new Long(idNuevo));
				
				getAsignacionClienteModel().setListaClientesEjecutivo(parametrosBO.listaClientesDeEjecutivo(usuarioAsesor));
				
				Map parametros = this.getParametrosReporte(); 

				parametros.put("p_ejecutivo",ejecutivoSelected.get("value"));

				((HttpSession)ctx.getExternalContext().getSession(true)).setAttribute("listaAsignacionCliente", getAsignacionClienteModel().getListaClientesEjecutivo());
			
			((HttpSession)ctx.getExternalContext().getSession(true)).setAttribute("listaAsignacionCliente_param", parametros);

			if(idNuevo.equals("0") || idNuevo.equals("")){
				getAsignacionClienteModel().setMostrarBtnAgregar(false);
			}else{
				getAsignacionClienteModel().setMostrarBtnAgregar(true);
			}
				
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	public void grabarAsignacion(){
		try {
			HashMap ejecutivoSelected = asignacionClienteModel.getEjecutivoAAsignar();
			RequestContext context = RequestContext.getCurrentInstance(); 
			FacesContext ctx=FacesContext.getCurrentInstance();
			this.setMensajeAgregar("");
			UsuarioAsesor usuarioAsesor = new UsuarioAsesor();
			cliente= new Cliente();
			usuarioAsesor.setIdUsuarioAsesor(new Long(getAsignacionClienteModel().getEjecutivoAAsignar().get("value").toString()));
			clienteBO.grabarClientesAsignados(usuarioAsesor, getAsignacionClienteModel().getListaClientesEjecutivo(),getAsignacionClienteModel().getListaClientesSeleccionados());
						
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Se guard\u00f3\n la asignacion correctamente", ""));
			
			getAsignacionClienteModel().setListaClientesEjecutivo(parametrosBO.listaClientesDeEjecutivo(usuarioAsesor));
			getAsignacionClienteModel().getListaClientesSeleccionados().clear();
			getAsignacionClienteModel().getListaTemporalSeleccionados().clear();
			getAsignacionClienteModel().setListaConsultaClientes(clienteBO.listarClienteNoAsignados(cliente));
			
			Map parametros = this.getParametrosReporte();
			 
			parametros.put("p_ejecutivo",ejecutivoSelected.get("value"));
			
			((HttpSession)ctx.getExternalContext().getSession(true)).setAttribute("listaAsignacionCliente", getAsignacionClienteModel().getListaClientesEjecutivo());
			
			((HttpSession)ctx.getExternalContext().getSession(true)).setAttribute("listaAsignacionCliente_param", parametros);	
		}catch(Exception e) {
			e.printStackTrace(); 
		}
	}
	
	public void eliminarClientes(Object ob){
		Cliente oCliente = (Cliente)ob;
		getAsignacionClienteModel().getListaClientesSeleccionados().remove(oCliente);
		getAsignacionClienteModel().getListaConsultaClientes().add(oCliente);
	}
	
	public void onRowSelect(Object ob){
		getAsignacionClienteModel().getListaTemporalSeleccionados().clear();
		Cliente cliente = (Cliente) ob;
		getAsignacionClienteModel().getListaTemporalSeleccionados().add(cliente);
	}
	
	public void onRowUnselect(Object ob){
		Cliente cliente = (Cliente) ob;
		getAsignacionClienteModel().getListaTemporalSeleccionados().remove(cliente);
	}
	
	public String getMensajeAgregar() {
		return mensajeAgregar;
	}

	public void setMensajeAgregar(String mensajeAgregar) {
		this.mensajeAgregar = mensajeAgregar;
	}

	public List<Cliente> getListaTemporalClientes() {
		return listaTemporalClientes;
	}

	public void setListaTemporalClientes(List<Cliente> listaTemporalClientes) {
		this.listaTemporalClientes = listaTemporalClientes;
	}
	
	public boolean isInMostrarFormMsg() {
		return inMostrarFormMsg;
	}

	public void setInMostrarFormMsg(boolean inMostrarFormMsg) {
		this.inMostrarFormMsg = inMostrarFormMsg;
	}

	public SelectItem[] getListaFormatos() {
		return listaFormatos;
	}

	public void setListaFormatos(SelectItem[] listaFormatos) {
		this.listaFormatos = listaFormatos;
	}

	public String getMsgMostrarFormMsg() {
		return msgMostrarFormMsg;
	}

	public void setMsgMostrarFormMsg(String msgMostrarFormMsg) {
		this.msgMostrarFormMsg = msgMostrarFormMsg;
	}

	public int getRbFormato() {
		return rbFormato;
	}

	public void setRbFormato(int rbFormato) {
		this.rbFormato = rbFormato;
	}

	public AsignacionClienteModel getAsignacionClienteModel() {
		return asignacionClienteModel;
	}

	public void setAsignacionClienteModel(
			AsignacionClienteModel asignacionClienteModel) {
		this.asignacionClienteModel = asignacionClienteModel;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}
	
	public String getHiddenText() {
		return hiddenText;
	}

	public void setHiddenText(String hiddenText) {
		this.hiddenText = hiddenText;
	}

	public String getMensajeConfirmacion() {
		return mensajeConfirmacion;
	}

	public void setMensajeConfirmacion(String mensajeConfirmacion) {
		this.mensajeConfirmacion = mensajeConfirmacion;
	}

	public String getFechaActual() {
		return fechaActual;
	}

	public void setFechaActual(String fechaActual) {
		this.fechaActual = fechaActual;
	}

	public List<Cliente> getListaConsultaClientesFilter() {
		return listaConsultaClientesFilter;
	}

	public void setListaConsultaClientesFilter(
			List<Cliente> listaConsultaClientesFilter) {
		this.listaConsultaClientesFilter = listaConsultaClientesFilter;
	}

	public List<Cliente> getListaClientesEjecutivoFilter() {
		return listaClientesEjecutivoFilter;
	}

	public void setListaClientesEjecutivoFilter(
			List<Cliente> listaClientesEjecutivoFilter) {
		this.listaClientesEjecutivoFilter = listaClientesEjecutivoFilter;
	}
}
